using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Decisions.HL7.Message;
using DecisionsFramework;

namespace Decisions.HL7.Message
{
    public class ResponseLevelAttribute:RuleAttribute
    {
        private Dictionary<HL7Version, string[]> validVersionCodes = new Dictionary<HL7Version, string[]>();
        private Dictionary<HL7Version, string[]> validVersionDescriptions = new Dictionary<HL7Version, string[]>();
        private Dictionary<HL7Version, HL7TableType> tableVersionTypes = new Dictionary<HL7Version, HL7TableType>();

        public ResponseLevelAttribute()
        {
            // init the values for table version types
						tableVersionTypes[HL7Version.v23] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v231] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v24] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v25] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v251] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v26] = HL7TableType.HL7;
						tableVersionTypes[HL7Version.v27] = HL7TableType.HL7;
			
            
			// init the values for version codes
						validVersionCodes[HL7Version.v23] = new string[]{"AL","ER","NE","SU"};
						validVersionCodes[HL7Version.v231] = new string[]{"NE","ER","AL","SU"};
						validVersionCodes[HL7Version.v24] = new string[]{"NE","ER","AL","SU"};
						validVersionCodes[HL7Version.v25] = new string[]{"NE","ER","AL","SU"};
						validVersionCodes[HL7Version.v251] = new string[]{"NE","ER","AL","SU"};
						validVersionCodes[HL7Version.v26] = new string[]{"NE","ER","AL","SU"};
						validVersionCodes[HL7Version.v27] = new string[]{"NE","ER","AL","SU"};
			
			// init the values for version descriptions
						validVersionDescriptions[HL7Version.v23] = new string[]{"Always.  All MFA segments (whether denoting errors or not) must be returned via the application level acknowledgement message","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application level acknowledgement for this message","Never.  no application level response needed","Success.  Only MFA segments denoting success must be returned via the application level acknowledgement for this message"};
						validVersionDescriptions[HL7Version.v231] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level  acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
						validVersionDescriptions[HL7Version.v24] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
						validVersionDescriptions[HL7Version.v25] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
						validVersionDescriptions[HL7Version.v251] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
						validVersionDescriptions[HL7Version.v26] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
						validVersionDescriptions[HL7Version.v27] = new string[]{"Never.  No application-level response needed","Error/Reject conditions only.  Only MFA segments denoting errors must be returned via the application-level acknowledgment for this message","Always.  All MFA segments (whether denoting errors or not) must be returned via the application-level acknowledgment message","Success.  Only MFA segments denoting success must be returned via the application-level acknowledgment for this message"};
			            

        }

        
        public override ValidationIssue[] RunRule(string name, object owningObject, object value)
        {
            //todo: check if the value is valid in the current version
            //if the value is not valid in the current version, add it as a validation issue


            return new ValidationIssue[0];
        }
    }
}
